package py.progweb.sgc.manager.impl;

import java.io.Serializable;
import java.util.List;

import javax.annotation.security.PermitAll;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import py.progweb.sgc.manager.ABMManagerLocal;
import py.progweb.sgc.model.EntidadBase;

/**
 * Session Bean implementation class ABMManagerImpl
 */
@Stateless(name="ABMManager")
public class ABMManagerImpl extends BaseManager implements ABMManagerLocal {
	
	@PersistenceContext(unitName="sgc-jpa")
	EntityManager em;

    /**
     * Default constructor. 
     */
    public ABMManagerImpl() {
        // TODO Auto-generated constructor stub
    }

	@PermitAll
	public List<? extends EntidadBase> buscar(Class<? extends EntidadBase> clazz) {	
		logger.info("Buscando instancias de " + clazz.getName());
		
		return em.createQuery("select c from " + clazz.getSimpleName() + " c").getResultList();
	}


	public void guardar(EntidadBase entity) {
		//logger.info("guardando " + entity.getClass() + " con pk: " + entity.getPK().toString());
		
		if (entity.getPK() == null)
			em.persist(entity);
		else
			em.merge(entity);
	}


	public void borrar(EntidadBase entity) {
		logger.info("borrando " + entity.getClass() + " con pk: " + entity.getPK().toString());
		
		entity = buscar(entity.getClass(), (Serializable)entity.getPK());
		em.remove(entity);
	}

	public void borrar(List<? extends EntidadBase> entidades) {
		for(EntidadBase e : entidades)
			borrar(e);
	}
	
	public void refresh(EntidadBase entity){
		em.refresh(entity);
	}


	public EntidadBase buscar(Class clazz, Serializable pk) {
		logger.info("buscando " + clazz.getName() + " con pk: " + pk.toString());
		return (EntidadBase)em.find(clazz, pk);
	}

}
